package Control;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import Entities.Server;
import Entities.Task;
import Helper.CheckerClass;
public class TaskScheduler implements Runnable {
private int sleepingTime;
private int maxArrivalTime;
private int minArrivalTime;
private int maxServiceTime;
private int minServiceTime;
private int startingTime;
private int finishTime;
private int simulationTime;
private int numberOfServers;
private boolean goodValues;
private CheckerClass checker;
private TaskGenerator generator;
private List<Server> serverList;
public TaskScheduler(String startingTime, String finishTime, String maxArrival, String minArrival,
String maxService, String minService, String nrnumberOfServers, DisplayControl controler,
String sleepingTime) {
goodValues = true;
try {
this.sleepingTime = Integer.parseInt(sleepingTime);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "Error at sleeping time", "error", JOptionPane.ERROR_MESSAGE);
}
// check arrival and service intervals
checkSeconds(maxArrival, "Maximum Arrival");
checkSeconds(minArrival, "Minimum Arrival");
checkSeconds(maxService, "Maximum Service");
checkSeconds(minService, "Minimum Service");
// check number of numberOfServers
numberOfServers = 0;
try {
numberOfServers = Integer.parseInt(nrnumberOfServers);
} catch (NumberFormatException e) {
goodValues = false;
JOptionPane.showMessageDialog(null, "Invalid format for number servers", "ERROR numeric format",
JOptionPane.ERROR_MESSAGE);
}
// check the starting time
if (checker.checkTimeFormat(startingTime)) {
this.startingTime = (Integer.parseInt(startingTime.substring(0, 2))) * 3600
+ (Integer.parseInt(startingTime.substring(3, 5))) * 60
+ (Integer.parseInt(startingTime.substring(6)));
} else {
goodValues = false;
JOptionPane.showMessageDialog(null, "Invalid format for starting time !", "ERROR time format",
JOptionPane.ERROR_MESSAGE);
}
// check the finish time
if (checker.checkTimeFormat(finishTime)) {
this.finishTime = (Integer.parseInt(finishTime.substring(0, 2))) * 3600
+ (Integer.parseInt(finishTime.substring(3, 5))) * 60 + (Integer.parseInt(finishTime.substring(6)));
} else {
goodValues = false;
JOptionPane.showMessageDialog(null, "Invalid format for finish time !", "ERROR time format",
JOptionPane.ERROR_MESSAGE);
}
if (goodValues) {
simulationTime = this.startingTime;
generator = new TaskGenerator();
serverList = new ArrayList<Server>();
for (int i = 0; i < numberOfServers; i++) {
serverList.add(new Server(i, this.simulationTime, this.finishTime, controler, this.sleepingTime));
}
}
}
private void checkSeconds(String seconds, String message) {
checker = new CheckerClass();
if (checker.checkSecondsFormat(seconds)) {
switch (message) {
case "Maximum Arrival":
maxArrivalTime = Integer.parseInt(seconds);
break;
case "Minimum Arrival":
minArrivalTime = Integer.parseInt(seconds);
break;
case "Maximum Service":
maxServiceTime = Integer.parseInt(seconds);
break;
case "Minimum Service":
minServiceTime = Integer.parseInt(seconds);
break;
}
} else {
goodValues = false;
JOptionPane.showMessageDialog(null, "Invalid format for " + message + " time !", "ERROR seconds format",
JOptionPane.ERROR_MESSAGE);
}
}
public void sendTaskToServer(Task task, int sendingTime) {
// best server is the one with the smallest amount of tasks to serve
Server bestServer = serverList.get(0);
int minSize = bestServer.getTaskQueue().size();
for (Server server : serverList) {
if (server.getTaskQueue().size() < minSize)
bestServer = server;
}
bestServer.receiveTask(task, sendingTime);
}
@Override
public void run() {
if (goodValues) {
for (Server server : serverList) {
server.start();
}
Task currentTask = generator.generateTask(minArrivalTime, maxArrivalTime, minServiceTime, maxServiceTime);
currentTask.setArrivalTime(currentTask.getArrivalTime() + simulationTime);
System.out.println(currentTask + " is preparing");
while (simulationTime <= finishTime) {
System.out.println(simulationTime);
if (currentTask.getArrivalTime() == simulationTime) {
sendTaskToServer(currentTask, simulationTime);
currentTask = generator.generateTask(minArrivalTime, maxArrivalTime, minServiceTime,
maxServiceTime);
currentTask.setArrivalTime(currentTask.getArrivalTime() + simulationTime);
System.out.println(currentTask + " is preparing");
}
try {
Thread.sleep(sleepingTime);
} catch (InterruptedException e) {
System.out.println("Sleeping error in TaskScheduler");
}
simulationTime++;
}
}
}
}